[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
1 はじめに
IoT事業部の平内(SIN)です。
AWS IT Greengrass V2(以下、Greengrass V2)では、Lambda関数もコンポーネントの1つとして利用可能です。
https://www.youtube.com/watch?v=pVYmcXatcT8
今回は、Lambda関数をデプロイしてみました。
2 Lambda
Lambdaは、「一から作成」で作成し、ランタイムは、Python3.8となっています。
プログラムは、ログ出力するだけの超簡単なものです。
def lambda_handler(event, context): print("? lambda started. event:{}".format(event))
コンポーネントとして登録する際、バージョン指定が必要($LATESTは使用できない)なので、「新しいバージョンを発行」しました。
3 コンポーネント
「Lambda関数をインポートする」を選択して新規にコンポーネントを作成しました。 指定したLambda関数及び、バージョンは、上記で作成したものです。
Lambda関数のコンポーネントで「イベントソース」の設定があります。 こちらは、LambdaをInvokeするキッカケとなるイベントを設定するもので、トピックの発行元として、「AWS IoT Core」及び、「ローカル発行」の2種類から選択可能です。
今回は、AWS IoT Coreのメッセージブローカーを発行元とし、トピックとして、「topic/lambda」を定義しました。
その他の設定は、全てデフォルトのままでコンポーネント作成を進めています。
gg_sample_function バージョン 1.0.0として作成されている様子です。
4 デプロイ
デプロイも今回、コアデバイス(gg-device-002)だけをターゲットするものを新規に作成しました。
コンポーネントの選択では、Lambdaのコンポーネントと、動作確認用に、aws.greengrass.Cli及び、aws.greengrass.LocalDebugConsoleを追加しています。
デプロイが完了した時点で、デバイス側で、コンポーネントを一覧してみました。
デプロイでは指定していない下記の3つのコンポーネントが、依存関係として自動的にインストールされていることが確認できます。
- aws.greengrass.LambdaManager
- aws.greengrass.LambdaLauncher
- aws.greengrass.LambdaRuntimes
$ sudo /greengrass/v2/bin/greengrass-cli component list ・・・略・・・ Component Name: aws.greengrass.LambdaManager Version: 2.1.3 State: RUNNING Configuration: {"getResultTimeoutInSecond":"60"} Component Name: aws.greengrass.LambdaLauncher Version: 2.0.8 State: FINISHED Configuration: {} Component Name: aws.greengrass.LambdaRuntimes Version: 2.0.7 State: FINISHED Configuration: {} ・・・略・・・ Component Name: gg_sample_function Version: 1.0.0 State: RUNNING Configuration: {"containerMode":"NoContainer","containerParams":{"devices":{},"memorySize":16000.0,"mountROSysfs":false,"volumes":{}},"inputPayloadEncodingType":"json","lambdaExecutionParameters":{"EnvironmentVariables":{}},"maxIdleTimeInSeconds":60.0,"maxInstancesCount":100.0,"maxQueueSize":1000.0,"pinned":true,"pubsubTopics":{"0":{"topic":"topic/lambda","type":"IOT_CORE"}},"statusTimeoutInSeconds":60.0,"timeoutInSeconds":3.0}
5 動作確認
イベントソースとして設定した、AWS IoT Coreのメッセージブローカーへ、topic/lambdaをpublishしてみました。
コンポーネントのログをtailで確認すると、トピックの到着と同時にLambdaが実行されている様子を確認できます。
※一部折り返して表示しています。
$ sudo tail -f /greengrass/v2/logs/gg_sample_function.log ・・・略・・・ 2021-08-13T04:12:09.563Z [INFO] (pool-2-thread-75) gg_sample_function: lambda_function.py:2,? lambda started. event:{'message': 'AWS IoT コンソールからの挨拶'}. {serviceInstance=0, serviceName=gg_sample_function, currentState=RUNNING} 2021-08-13T04:12:21.632Z [INFO] (pool-2-thread-75) gg_sample_function: lambda_function.py:2,? lambda started. event:{'message': 'AWS IoT コンソールからの挨拶'}. {serviceInstance=0, serviceName=gg_sample_function, currentState=RUNNING}
6 最後に
今回は、Lambdaによるコンポーネントを試してみました。
Greengrass V2では、プログラムの実行が、Lambdaに依存していないため、今一つ、メリット感じづらいのですが・・・トピックで起動する仕組みが予め備わっているので、トリガーがこれで良ければ、その仕組みをわざわざ実装する必要がないので、便利かも知れません。
なお、デフォルトでは、Lambdaコンポーネントは、コンテナで分離実行するように定義されていますが、コンテナ外での実行も指定可能です。リソースの許可設定等の作業は必要なくなるので、より簡単に利用できそうです。
7 参考リンク
[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました